package gold.gold04;

import java.util.ArrayList;

/**
 *
 */
public class S1604井字游戏 {
    /**
     * 80, 对角好解决, 行列搜索一下?怎样减少搜索次数?找个办法记一下可行的行列吧。
     * 有一些关于String等类的方法用法值得学习。
     * 不知道直接暴力搜索会不会也很快?
     */
    public String tictactoe(String[] board) {
        boolean isXWin = isWin(board, 'X');
        if(isXWin) return "X";
        boolean isOWin = isWin(board, 'O');
        if(isOWin) return "O";
        for(String s: board){
            // 注意这里的contains方法, 常用的就是传个String进去。
            if(s.contains(" ")) return "Pending";
        }
        return "Draw";
    }
    /**
     * 帮助函数, 分三部分, 纵向是否胜利, 横向, 斜向。
     */
    public boolean isWin(String[] board, char target){
        ArrayList<Integer> selectList = new ArrayList<>();
        for(int i = 0; i < board.length; i++)
            selectList.add(i);
        for(int i = 0; i < board.length; i++){
            // 循环每一行, 判断纵向有没有连续的
            int loc = i;
            selectList.removeIf(e -> board[loc].charAt(e) != target);// removeIf是ArrayList独有的。
        }
        if(selectList.size() > 0) return true;
        for(int i = 0; i < board.length; i++)
            selectList.add(i);
        for(int i = 0; i < board.length; i++){
            // 循环每一列, 判断横向有没有连续的
            int loc = i;
            selectList.removeIf(e -> board[e].charAt(loc) != target);
        }
        if(selectList.size() > 0) return true;
        // 斜向是否胜利
        boolean obliWin1 = true;
        for(int i = 0; i < board.length; i++){
            if(board[i].charAt(i) != target)
                obliWin1 = false;
        }
        if(obliWin1) return true;
        boolean obliWin2 = true;
        for(int i = 0; i < board.length; i++){
            if(board[board.length - 1 - i].charAt(i) != target)
                obliWin2 = false;
        }
        if(obliWin2) return true;
        return false;
    }


    /**
     * char->int, 想法不错。
     */
    public String tictactoe2(String[] board) {

        int length = board.length;
        int heng = 0; //横的和
        int zong = 0; //纵的和
        int left = 0; //左斜线
        int right = 0; //右斜线
        boolean flag = false; //记录有没有空格

        for (int i = 0; i < length; i++) {

            heng = 0; zong = 0;

            for (int j = 0; j < length; j++) {

                heng = heng +  (int) board[i].charAt(j);
                zong = zong + (int) board[j].charAt(i);

                if(board[i].charAt(j) == ' ') flag = true;

            }

            //横纵检查
            if (heng == (int)'X' * length || zong == (int)'X' * length) return "X";
            if (heng == (int)'O' * length || zong == (int)'O' * length) return "O";

            //两条斜线上的相加
            left = left + (int)board[i].charAt(i);
            right = right + (int)board[i].charAt(length - i - 1);

        }

        //两条斜线检查
        if (left == (int)'X' * length || right == (int)'X' * length) return "X";
        if (left == (int)'O' * length || right == (int)'O' * length) return "O";

        if (flag) return "Pending";
        return "Draw";

    }

}
